المدخلات التماثلية في الآردوينو Analog Inputs
درس يشرح كيفية التعامل مع المدخلات التماثلية Analog Inputs في الآردوينو مع مثال قياس الفولتية.
يحتوي الآردوينو على نقاط ارتباط من الممكن ربطها إلى دائرة (Analog To Digital Converter) داخل المعالج الدقيق تقوم بقياس قيمة الفولتية المسلطة على هذا المدخل. تقوم دوائر (ADC) بقياس قيمة الفولتية المطلوبة نسبة إلى نقطتين مرجعيتين. أي أن هذه الدائرة لا تستطيع قياس الفولتية بشكل مطلق. تقاس دقة دائرة التحويل بعدد البتات (bit) الناتجة من عملية التحويل حيث إن زيادة عدد البتات الناتجة من العملية تعطينا دقة اكثر. لمعرفة السبب وراء ذلك علينا فهم الطريقة التي تتبعها هذه الدائرة للعمل.
كيف تعمل دوائر التحويل من خطي الى ثنائي؟
لفهم كيفية عمل دوائر (ADC) سنقوم بأخذ معطيات دوائر (ADC) الموجودة على الآردوينو كمثال. يتكون ناتج دوائر ADC في الآردوينو من 10 bit (توجد موديلات معينة من الآردوينو تحتوي على ADC بدقة 12 بت). أي إن ناتج عملية التحويل ممكن أن يتراوح بين 0 و 1023 (0000000000 , 1111111111 بالنظام الثنائي). تقوم دائرة التحويل بتقسيم الفولتية المرجعية إلى 1023 جزء. تكون فولتية المرجعية افتراضياً هي فولتية الدخول أي إن فولتية المرجع الأدنى هي 0 فولت و المرجع الأعلى 5 فولت. بتقسيمها إلى 1023 جزء, ستكون فولتية الجزء الواحد (الخطوة الواحدة) 0.00488 فولت. لقياس الفولتية الداخلة, تقوم الدائرة بتشغيل عداد يحسب عدد الخطوات التي تحتاجها الدائرة للوصول إلى فولتية تكون مساوية أو اكبر من الفولتية المطلوب قياسها, عند الوصول إلى هذه الفولتية, تعطي الدائرة قيمة العداد كمقياس لنسبة الفولتية الداخلة إلى فولتيات المرجعية.
لإيضاح فكرة دقة الدائرة (Resolution), لنأخذ دائرتين بدقتين مختلفة و نقارن بينهما. الدائرة الأولى يتكون ناتجها من أربعة بتات (4bit resolution) و الثانية من عشر بتات (10bit resolution). فولتية المرجعية لكلتا الدائرتين متطابقة (0-5) فولت و الفولتية الداخلة المطلوب قياسها هي 2.75 فولت.
ستقوم الدائرة الأولى بتقسيم فولتية المرجعية إلى 32 جزء. أي إن قيمة الخطوة الواحدة ستكون 0.15625 فولت. سيبدأ العداد بالتزايد ويصل حتى الخطوة رقم 18 حيث ستصبح الفولتية المقارنة مع الفولتية الداخلة اكبر فيتوقف العداد وتكون النتيجة 18. بمعرفة الفولتية المرجعية, نستطيع الآن أن نحسب قيمة الفلوتية التي تم قياسها و هي ((18/32)*(5-0)) حيث ستكون النتيجة 2.8125 فولت.
لنقم الآن بإعادة الحسابات للدائرة ذات الدقة 10 بت. تكون فولتية الخطوة الواحدة 0.00488. سيبدأ العداد بالزيادة حتى يصل الخطوة رقم 563, حيث ستصبح الفولتية المقارنة مع الفولتية الداخلة اكبر و سيكون ناتج التحويل هو 563. بإعادة حساب الفولتية ((563/1023)*(5-0)) تكون الفولتية المحسوبة 2.75171 فولت.
لاحظ الآن الفرق بين النتيجتين عن الفولتية الداخلة. تحيد قراءة الدائرة الأولي عن القيمة الحقيقية بـ (2.8125 - 2.75) أي 0.0625 فولت (62.5 ملي فولت) في حين تحيد الفولتية ألمقاسه عبر الدائرة الثانية (2.75171 - 2.75) أي 0.00171 فولت (1.71 ملي فولت).
تحتاج دوائر ADC إلى معالجات سريعة جدا لزيادة دقة القياس وإلا فإن الزمن الذي ستستغرقه عملية القياس سيكون طويلا. تزداد أهمية استخدام دوائر بدقة أعلى مع زيادة الفرق بين فولتيتي المرجعية.
إعدادات ADC الموجود في الآردوينو.
اصبح من الواضح الآن إن لعمل أي ADC فهو بحاجة إلى معرفة فولتيات المرجعية ليقارن الفولتية الداخلة معها, و إن ناتج العملية يكون نسبة الى فولتية المرجعية. إضافة إلى ذلك يمكنك تحديد دقة ADC الموجود في الآردوينو في حال كنت تحتاج إلى دقة اقل و وقت قياس اسرع.
لتحديد فولتية المرجعية الأعلى للآردوينو نستخدم الأمر ()analogReference, يمكنك الاختيار من واحد من المرجعيات التالية:
- DEFAULT, تكون فولتية المرجعية الأعلى هي فولتية التغذية للوح التطوير (5 فولت او 3.3 فولت حسب موديل اللوج)
- INTERNAL, وهي فولتية مرجعية داخلية موجودة في الآردوينو (1.1 فولت للآردوينو موديل ATmega168 او ATmega328 و 2.56 فولت للموديل ATmega8). (لا يمكن استخدام هذا الاختيار مع الآردوينو Mega).
- INTERNAL1V1, فولتية مرجعية داخلية في الآردوينو Mega فقط. تكون فولتية المرجعية العليا 1.1 فولت.
- INTERNAL2V56, فولتية مرجعية داخلية في الآردوينو Mega فقط. تكون فولتية المرجعية العليا 2.56 فولت.
- EXTERNAL, فولتية مرجعية عليا خارجية تربط إلى نقطة الارتباط AREF. انتبه إلى إن هذه الفولتية يجب أن تكون بين 0 و 5 فولت. و يجب أن تقوم بوضع هذا الأمر قبل أي أمر لقراءة الفولتية لأن ذلك قد يسبب التلف للآردوينو.
أما لتحديد دقة القياس فيمكن تحديد عدد بتات الناتج عن طريق الأمر ()analogReadResolution, مع تحديد عدد البتات داخل الأقواس بين 0 و 16. لاحظ انك تستطيع تقليل دقة القياس لكن لا يمكنك زيادتها عن القدرة ألتصميميه للآردوينو أما في حال قمت باختيار رقم أعلى من القدرة التصميمية فأن الناتج لن يزيد عن القيمة العليا المصمم لها لكنه سيقوم بإضافة أصفار للوصول إلي العدد المطلوب من البنات.
كيفية قياس الفولتية الداخلة.
لقياس الفولتية الداخلة على احد أطراف الارتباط, يمكنك استخدام الأمر ()analogRead. يجب تحديد الطرف المطلوب القياس منه, لقياس الفولتية على الطرف A0 نكتب الأمر analogRead(A0).
كما ذكرنا سابقاً فإن ناتج عملية القياس هو نسبة الفولتية ألمقاسه إلى فولتية المرجعية. لمعرفة قيمة الفولتية الداخلة بالفولت نقوم بقسمة الناتج على عدد خطوات ADC ثم نقوم بضربها في قيمة فولتية المرجعية الأعلى. مثال, لنفرض انك حصلت على ناتج 500 وكانت دقة المقياس 10 بت و فولتية المرجعية الأعلى هي 5 فولت فإن الفولتية الداخلة ستكون ((500/1023)*5) سيكون الناتج 2.44 فولت.
لنبدأ الآن بعمل تجربة عملية لتوضيح الفكرة اكثر وهي تشغيل الآردوينو كمقياس فولتية (فولتميتر).
سنقوم الآن بكتابة برنامج يقوم بقياس الفولتية الداخلة إلى نقطة الارتباط A0 و عرض الفولتية الناتجة على شاشة الحاسوب. نربط طرفي مقاومة متغيرة إلى 5V و GND في الآردوينو و نربط الطرف الأوسط للمقاومة إلى الطرف A0 في الآردوينو. ستتغير الفولتية على طرف المقاومة الأوسط بتحريكها بقيمة تتراوح من 0 إلى 5 فولت. لنبدأ الآن بكتابة برنامج الآردوينو.
يقوم البرنامج ببساطة بقراءة ناتج analogRead و استخراج قيمة الفولتية الداخلة بالفولت و عرضها على الحاسوب عن طريق الأمر Serial.println.
void setup() {
Serial.begin(9600);
}
void loop() {
int m;
float r;
m = analogRead(A0);
r = m*5.0/1023.0;
Serial.println(r);
delay(500);
}
تلاحظ هنا وجود نوعين من المتغيرات في البرنامج, الأول من نوع int أي رقم صحيح ونضع فيه القيمة الناتجة من عملية القياس و الثاني من نوع float وهو النوع الذي يحتوي على أعشار. لاحظ أيضاً أهمية كتابة الأرقام 5.0 و 1023.0 ليتم التعامل معها على إنها أرقام تحتوي على أعشار وإلا ستكون النتيجة عدد صحيح. سيتم الشرح اكثر عن المتغيرات في درس آخر إن شاء الله. أما delay فهو يستخدم لتأخير الوقت بين قياس و اخر و إلا ستكون القراءات على الحاسوب اسرع مما تستطيع قراءته. قد تلاحظ وجود فرق بسيط بين قراءات الآردوينو و الفولتميتر يعود إلى وجود نسبة خطأ في كلا الجهازين وهو أمر طبيعي.
يمكنك مشاهدة الفديو التالي للتجربة ومقارنة الفولتية ألمقاسه من قبل الآردوينو مع الفولتية ألمقاسه بالفولتميتر.